"""
handler 对象作为处理器,它可以由 不同创建方式 而扩展不同的功能,使 opener 对象也拥有相应的扩展功能.
1.通过 urllib.request.HTTPHandler() 创建,拥有处理 HTTP 协议的功能
2.通过http.cookiejar.CookieJar() 创建,可以拥有携带 cookie 的功能,同使 opener 对象也拥有这个功能
3.携带 Cookie 功能的 handler 的创建：handler = urllib.request.HTTPCookieProcessor(cookie)

知识点:
- http.cookiejar.CookieJar()
- urllib.request.HTTPCookieProcessor(cookie)
- urllib.build_opener(handler)

简要步骤：cookie handler opener open open

原理：通过 cookie 创建的 opener，每次访问 服务器时，服务器返回的 cookie 都会保存在 opener 中，
此时如果通过 opener 访问直接访问 同一 服务器的 其他页面（接口）时，因为保留了 cookie的原因，所以能够直接访问。

"""

from http.cookiejar import CookieJar
from urllib.request import build_opener, HTTPCookieProcessor, Request,urlopen
from urllib.parse import urlencode
import json

# POST 请求 API 接口，也就是登录接口
post_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=20182122180'

# data
# 包含账号和密码
data = {
	'rkey': '1c7df63368df7ce73c234de26178ec11',
	'password': '19870115',
	'origURL': 'http://www.renren.com/home',
	'key_id': '1',
	'icode': '',
	'f': 'http://www.renren.com/224549540',
	'email': 'dqsygcz@126.com',
	'domain': 'renren.com',
	'captcha_type': 'web_login',
}

# 头部信息
headers = {
	'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'
}

# 先创建 cookie 对象
cookie = CookieJar()

# 通过 cookie 对象创建 handler 对象,使其拥有携带 cookie 的功能
handler_cookie = HTTPCookieProcessor(cookie)

# 通过 handler_cookie 对象创建 opener 对象，使这个伪浏览器也有携带 cookie 的功能
opener = build_opener(handler_cookie)

# 创建 request 对象,封装 post_url data 和 headers
# 因为是 POST 请求，所以 先将 data 字典转换为 url 可识别数据，然后再编码为字符串形式
req = Request(url=post_url, data=urlencode(data).encode('utf-8'), headers=headers)

# 向服务器发送请求
# 服务器返回的 响应对象中携带用户登录信息的 cookie
# 且 opener 中也保存了从服务器返回的 cookie 信息
# 下次使用 opener 访问人人网的其他页面接口时，可以直接登录上去
# 每次执行访问服务器，opener 都会保存从服务器返回的 cookie
resp_cookie = opener.open(req)

# # 读取响应数据，将字节解码为字典形式
# resp_data = resp_cookie.read().decode('utf-8')
#
# json_data = json.loads(resp_data)
# print(json_data)


# 这是个人主页的 URL 接口
# 本来登录到个人主页是需要账号和密码的
# 不过上面的 handler 已经携带从服务器返回的 Cookie，此时访问服务器，可以直接使用这个 Cookie
get_url = 'http://www.renren.com/224549540/profile'

headers1 = {
	'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36',
}

# 封装
req_1 = Request(url=get_url, headers=headers)

# 如果使用 urlopen() 访问服务器，则不能访问成功，因为没有 cookie，且没有先将 cookie 封头在 headers 中
#resp = urlopen(req_1)

# 此时的 opener 已经携带了从服务器返回的 cookie
resp = opener.open(req_1)

resp_data = resp.read().decode('utf-8')
print(resp_data)
with open('cookiejar.html', 'w', encoding='utf-8') as file:
	file.write(resp_data)
